package com.qf.service.impl;

import com.qf.constant.CacheConstants;
import com.qf.feign.CacheFeign;
import com.qf.model.StandardSubmit;
import com.qf.service.FilterChainManager;
import com.qf.service.FilterChainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 *
 * 策略 执行 管理器
 * @author 千锋教育
 * @Company http://www.mobiletrain.org/
 * @Version 1.0
 */
@Service
@Slf4j
public class FilterChainManagerImpl implements FilterChainManager {

    //@Autowired : 注入所有的策略模式对象
    // 以对象的名称为key， 以策略模式对象为value，注入到map集合中
    @Autowired
    Map<String, FilterChainService> filtersMap;

    @Autowired
    CacheFeign cacheFeign;

    //执行策略
    @Override
    public void execute(StandardSubmit submit) {
        //1. 获取 该客户端 需要的 策略（ 调用 cache模块）
        String key = CacheConstants.CACHE_PREFIX_CLIENT + submit.getClientID();
        String filed = "filters";
        String filters = cacheFeign.hget(key, filed);
        //2. 遍历执行 需要的策略
        if(! StringUtils.isEmpty(filters)) {
            String[] filterArr = filters.split(",");
            for (String filter : filterArr) {
                //从所有的策略对象中，根据 策略对象名称获取 策略对象
                FilterChainService filterChainService = filtersMap.get(filter);
                if(filterChainService != null) {
                    //执行策略
                    boolean flag = filterChainService.strategy(submit);
                    //如果某策略 执行出现异常，则结束 责任链 流程
                    if(!flag) {
                        log.info("【策略模块 -- 策略管理器0】  执行策略完成！！！");
                        break;
                    }
                }

            }
        }


    }
}
